module ObsObject.CRayTrace ( Trace(..), genCRTraces )  where


import Control.Monad (replicateM)
import Random

import HSimMath

-- Поток космических частиц (шт * см^-2 * с^-1)

type Flux     = Double

-- Время экспозиции

type Exposure = Double

-- Представление прямоугольной площадки определенной толщины

type Area     = (Double, Double, Double) -- (ширина, высота, толщина)

-- След от космической частицы

data Trace    = Trace Point2D Point2D Double

-- Генерация следов от космических частиц для заданного потока, площади и времени экспозиции

genCRTraces :: Flux -> Area -> Exposure -> IO [Trace]
genCRTraces f a@(w,h,_) e = do

   replicateM n $ genCTrace a

   where
       n = round (f * e * w * h)

genCTrace :: Area -> IO Trace
genCTrace (w,h,t) = do
    x0      <- randomRIO (0, w)
    y0      <- randomRIO (0, h)
    azimut  <- randomRIO (0.0, 2*pi)
    fi      <- myRandomRIO

    let l  = t * tan fi
        dx = l * cos azimut
        dy = l * sin azimut

    return (Trace (x0,y0) (x0+dx, y0+dy) fi)

    where
       myRandomRIO = do
          x <- randomRIO (0.0, pi/2)
          y <- randomRIO (0.0, 1.0 )
          if y < sin (2*x)
             then return x
             else myRandomRIO